package cn.heyige.backend.ai;

import cn.heyige.backend.algorithm.PredictionResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 统一AI服务 - 遵循SpringAI最新规范
 * 
 * 整合AI服务功能，支持智谱AI、DeepSeek和阿里千问
 * 使用SpringAI的ChatClient API，简化代码结构
 * 
 * @author CodeBuddy
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class AiServiceImpl implements AiService {

    private final Map<String, ChatModel> chatModels = new ConcurrentHashMap<>();
    private final ChatClient.Builder chatClientBuilder;
    
    @Value("${ai.meihua.enabled:true}")
    private boolean aiEnabled;
    
    @Value("${ai.zhipu.enabled:true}")
    private boolean zhipuEnabled;
    
    @Value("${ai.deepseek.enabled:true}")
    private boolean deepseekEnabled;
    
    @Value("${ai.qwen.enabled:true}")
    private boolean qwenEnabled;

    public AiServiceImpl(
            ChatClient.Builder chatClientBuilder,
            Map<String, ChatModel> availableModels) {
        this.chatClientBuilder = chatClientBuilder;
        
        // 初始化可用的AI模型
        if (availableModels.containsKey("zhipu") && zhipuEnabled) {
            chatModels.put("zhipu", availableModels.get("zhipu"));
            log.info("智谱AI模型已启用");
        }
        
        if (availableModels.containsKey("deepseek") && deepseekEnabled) {
            chatModels.put("deepseek", availableModels.get("deepseek"));
            log.info("DeepSeek模型已启用");
        }
        
        if (availableModels.containsKey("qwen") && qwenEnabled) {
            chatModels.put("qwen", availableModels.get("qwen"));
            log.info("阿里千问模型已启用");
        }
        
        log.info("统一AI服务初始化完成，可用模型: {}, AI启用状态: {}", 
                chatModels.keySet(), aiEnabled && !chatModels.isEmpty());
    }

    /**
     * AI解读入口
     * 
     * @param result 预测结果
     * @param question 用户问题
     * @return AI解读结果
     */
    @Override
    public String interpret(PredictionResult result, String question) {
        if (!aiEnabled || chatModels.isEmpty()) {
            return generateFallbackInterpretation(result);
        }

        try {
            String prompt = buildPrompt(result, question);
            String response = callAiWithFallback(prompt);
            
            log.debug("AI解读完成，原卦: {}, 变卦: {}", result.getOriginalGua(), result.getChangedGua());
            return response;
            
        } catch (Exception e) {
            log.error("AI解读失败", e);
            return generateFallbackInterpretation(result);
        }
    }

    /**
     * 生成行动建议
     * 
     * @param result 预测结果
     * @param question 用户问题
     * @return 行动建议列表
     */
    @Override
    public List<String> generateActionSuggestions(PredictionResult result, String question) {
        if (!aiEnabled || chatModels.isEmpty()) {
            return getDefaultSuggestions();
        }

        try {
            String prompt = buildSuggestionPrompt(result, question);
            String response = callAiWithFallback(prompt);
            
            // 简单解析AI响应为建议列表
            return Arrays.stream(response.split("\n"))
                    .filter(line -> line.trim().matches("^\\d+\\..*"))
                    .map(line -> line.trim().replaceFirst("^\\d+\\.\\s*", ""))
                    .limit(5)
                    .toList();
            
        } catch (Exception e) {
            log.error("生成行动建议失败", e);
            return getDefaultSuggestions();
        }
    }

    /**
     * 调用AI服务，支持自动降级
     */
    private String callAiWithFallback(String prompt) {
        // 优先级：智谱AI > DeepSeek > 阿里千问
        List<String> modelPriority = Arrays.asList("zhipu", "deepseek", "qwen");
        
        for (String modelName : modelPriority) {
            if (chatModels.containsKey(modelName)) {
                try {
                    return callModel(modelName, prompt);
                } catch (Exception e) {
                    log.warn("模型 {} 调用失败，尝试下一个模型", modelName, e);
                    // 继续尝试下一个模型
                }
            }
        }
        
        // 所有模型都失败，返回默认解读
        return "由于AI服务暂时不可用，请参考以下通用建议：\n\n" +
               "1. 保持冷静理性的判断\n" +
               "2. 密切观察环境变化\n" +
               "3. 适时调整行动策略\n" +
               "4. 注重与他人的沟通协调\n" +
               "5. 把握时机，稳步前进";
    }

    /**
     * 调用指定模型
     */
    private String callModel(String modelName, String prompt) {
        ChatModel model = chatModels.get(modelName);
        if (model == null) {
            throw new IllegalArgumentException("模型不可用: " + modelName);
        }
        
        // 使用SpringAI的ChatClient API
        ChatClient chatClient = chatClientBuilder.build();
        
        return chatClient.prompt()
                .user(prompt)
                .call()
                .content();
    }

    /**
     * 构建AI提示词
     */
    private String buildPrompt(PredictionResult result, String question) {
        String safeQuestion = (question != null && !question.trim().isEmpty()) ? question : "请分析这个卦象的含义";
        
        return String.format("""
            你是专业的梅花易数大师，请根据以下卦象信息进行解读：
            
            【卦象信息】
            本卦：%s
            变卦：%s  
            互卦：%s
            体卦：%s（代表求测者）
            用卦：%s（代表所测之事）
            动爻：第%d爻
            五行关系：%s
            准确性：%.0f%%
            
            【用户问题】
            %s
            
            【解读要求】
            1. 基于体用五行关系分析吉凶
            2. 结合动爻变化预测发展趋势  
            3. 提供3-5条具体可行的建议
            4. 语言简洁专业，避免迷信色彩
            5. 重点关注实用指导价值
            
            请提供专业的卦象解读：
            """,
            result.getOriginalGua(),
            result.getChangedGua(),
            result.getMutualGua(),
            result.getBodyGua(),
            result.getUseGua(),
            result.getMovingYao(),
            result.getWuxingRelation(),
            result.getAccuracy() * 100,
            safeQuestion
        );
    }

    /**
     * 构建建议提示词
     */
    private String buildSuggestionPrompt(PredictionResult result, String question) {
        String safeQuestion = (question != null && !question.trim().isEmpty()) ? question : "请为这个卦象提供建议";
        
        return String.format("""
            你是专业的梅花易数大师，请根据以下卦象信息提供具体的行动建议：
            
            【卦象信息】
            本卦：%s
            变卦：%s  
            体卦：%s（代表求测者）
            用卦：%s（代表所测之事）
            动爻：第%d爻
            五行关系：%s
            
            【用户问题】
            %s
            
            请提供5条具体、可操作的行动建议，每条建议以数字编号开头（如"1. 建议"）：
            """,
            result.getOriginalGua(),
            result.getChangedGua(),
            result.getBodyGua(),
            result.getUseGua(),
            result.getMovingYao(),
            result.getWuxingRelation(),
            safeQuestion
        );
    }

    /**
     * 生成备用解读
     */
    private String generateFallbackInterpretation(PredictionResult result) {
        StringBuilder interpretation = new StringBuilder();
        
        interpretation.append("【卦象分析】\n");
        interpretation.append(String.format("本卦%s，变卦%s，体卦%s，用卦%s。\n\n", 
            result.getOriginalGua(), result.getChangedGua(), 
            result.getBodyGua(), result.getUseGua()));
        
        interpretation.append("【五行关系】\n");
        String relation = result.getWuxingRelation();
        if (relation.contains("用生体")) {
            interpretation.append("用卦生体卦，外界助力强，事情发展顺利。\n\n");
        } else if (relation.contains("用克体")) {
            interpretation.append("用卦克体卦，外界阻力大，需要谨慎应对。\n\n");
        } else if (relation.contains("比和")) {
            interpretation.append("体用同气，内外和谐，平稳发展。\n\n");
        } else {
            interpretation.append("体用关系需要结合具体情况分析。\n\n");
        }
        
        interpretation.append("【综合建议】\n");
        interpretation.append("1. 保持冷静理性的判断\n");
        interpretation.append("2. 密切观察环境变化\n");
        interpretation.append("3. 适时调整行动策略\n");
        interpretation.append("4. 注重与他人的沟通协调\n");
        interpretation.append("5. 把握时机，稳步前进\n\n");
        
        interpretation.append(String.format("【准确性参考】%.0f%%", result.getAccuracy() * 100));
        
        return interpretation.toString();
    }
    
    /**
     * 获取默认建议
     */
    private List<String> getDefaultSuggestions() {
        return Arrays.asList(
            "保持冷静理性的判断",
            "密切观察环境变化",
            "适时调整行动策略",
            "注重与他人的沟通协调",
            "把握时机，稳步前进"
        );
    }

    /**
     * 获取可用模型列表
     * 
     * @return 可用模型列表
     */
    public List<String> getAvailableModels() {
        return List.copyOf(chatModels.keySet());
    }

    /**
     * 检查指定模型是否可用
     * 
     * @param modelName 模型名称
     * @return 是否可用
     */
    public boolean isModelAvailable(String modelName) {
        return chatModels.containsKey(modelName);
    }

    /**
     * 获取默认模型
     * 
     * @return 默认模型名称
     */
    public String getDefaultModel() {
        // 优先级：智谱AI > DeepSeek > 阿里千问
        if (chatModels.containsKey("zhipu")) {
            return "zhipu";
        }
        if (chatModels.containsKey("deepseek")) {
            return "deepseek";
        }
        if (chatModels.containsKey("qwen")) {
            return "qwen";
        }
        return null;
    }
}